﻿using System;
using __ts.Core.Api;

/*
 *  author: able
 *  @2012/2/20 18:04:12
 * 
 */
namespace __ts.Core.Service
{
    /// <summary>
    /// 
    /// </summary>
    public interface IoHandler
    {
        /**
         * Invoked from an I/O processor thread when a new connection has been created.
         * Because this method is supposed to be called from the same thread that
         * handles I/O of multiple sessions, please implement this method to perform
         * tasks that consumes minimal amount of time such as socket parameter
         * and user-defined session attribute initialization.
         */
        void sessionCreated(IoSession session);

        /**
         * Invoked when a connection has been opened.  This method is invoked after
         * {@link #sessionCreated(IoSession)}.  The biggest difference from
         * {@link #sessionCreated(IoSession)} is that it's invoked from other thread
         * than an I/O processor thread once thread model is configured properly.
         */
        void sessionOpened(IoSession session);

        /**
         * Invoked when a connection is closed.
         */
        void sessionClosed(IoSession session);

        /**
         * Invoked with the related {@link IdleStatus} when a connection becomes idle.
         * This method is not invoked if the transport type is UDP; it's a known bug,
         * and will be fixed in 2.0.
         */
        void sessionIdle(IoSession session, IdleStatus status);

        /**
         * Invoked when any exception is thrown by user {@link IoHandler}
         * implementation or by MINA.  If <code>cause</code> is an instance of
         * {@link IOException}, MINA will close the connection automatically.
         */
        void exceptionCaught(IoSession session, Exception cause);

        /**
         * Invoked when a message is received.
         */
        void messageReceived(IoSession session, Object message);

        /**
         * Invoked when a message written by {@link IoSession#write(Object)} is
         * sent out.
         */
        void messageSent(IoSession session, Object message);
    }
}